import time

import serial
from serial.serialutil import SerialException
import serial.tools.list_ports


class SerialPort:
    def __init__(self, port='COM3', baudrate=9600, timeout=1):
        """
        初始化串口对象。

        :param port: 串口号，例如 'COM3' 或 '/dev/ttyUSB0'
        :param baudrate: 波特率，默认为9600
        :param timeout: 读取超时时间，默认为1秒
        """
        self.port = port
        self.baudrate = baudrate
        self.timeout = timeout
        self.ser = None

    @staticmethod
    def get_com_ports():
        # 列出所有COM端口
        ports = serial.tools.list_ports.comports()
        # 创建一个空列表来存储COM端口
        com_ports_list = []
        # 遍历所有COM端口并添加到列表中
        for port, desc, hwid in sorted(ports):
            com_ports_list.append(port)
        return com_ports_list

    def open(self):
        """
        打开串口。
        """
        try:
            self.ser = serial.Serial(self.port, self.baudrate, timeout=self.timeout)
            print(f"串口 {self.port} 已打开。")
        except SerialException as e:
            print(f"打开串口 {self.port} 失败: {e}")

    def close(self):
        """
        关闭串口。
        """
        if self.ser and self.ser.is_open:
            self.ser.close()
            print("串口已关闭。")

    def read(self, size=1):
        """
        从串口读取数据。

        :param size: 要读取的字节数，默认为1
        :return: 读取到的数据
        """
        if self.ser and self.ser.is_open:
            return self.ser.read(size)
        return None

    def write(self, data):
        """
        向串口写入数据。

        :param data: 要写入的数据，bytes类型
        """
        if self.ser and self.ser.is_open:
            self.ser.write(data)
            print(f"数据已发送: {data}")

    def in_waiting(self):
        """
        检查串口接收缓冲区中的字节数。

        :return: 缓冲区中的字节数
        """
        if self.ser and self.ser.is_open:
            return self.ser.in_waiting
        return 0


# 使用示例
if __name__ == "__main__":
    port_name = 'COM31'  # 请替换为实际的串口号
    baud_rate = 115200  # 根据你的设备设置波特率

    # 创建SerialPort对象
    serial_port = SerialPort(port_name, baud_rate)

    # 打开串口
    serial_port.open()

    try:
        # 读取数据
        # data = serial_port.read(10)
        # if data:
        #     print("从串口读取到的数据:", data)

        # 写入数据
        # serial_port.write(b'Hello, Serial Port!')

        # 轮询读取
        while True:
            data_waiting = serial_port.in_waiting()
            if data_waiting > 0:
                print("有数据可读...")
                read_data = serial_port.read(data_waiting)
                print("读取到的数据:", read_data)
            else:
                time.sleep(0.1)  # 休眠0.1秒
    finally:
        # 关闭串口
        serial_port.close()
